package Server;

import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.swing.JOptionPane;

import BD.BDDeclaration;
import ClasesBase.Fila;
import Server.SocketManager;

public class GestorServidor implements Runnable {

	private SocketManager sm;
	private String clientSentence;
	private boolean parar;
	private ArrayList<Fila> arrayFilas;
	private ArrayList<ArrayList<Fila>> arrayDeArrays;
	private BDDeclaration bd;

	public GestorServidor(SocketManager socket) {
		sm = socket;
		clientSentence = "";
		parar = false;
		bd = new BDDeclaration();
		arrayFilas = new ArrayList();
		arrayDeArrays = new ArrayList();
	}

	@Override
	public void run() {

		while (!parar) {
			try {
				clientSentence = sm.Leer();

				StringTokenizer tokens = new StringTokenizer(clientSentence, ":");
				String comando = tokens.nextToken();
				String clave = tokens.nextToken();

				if (comando.equals("CARGAINICIAL")) {

					System.out.println("SERVIDOR: Se cargan todas las filas en un ArrayList");
					System.out.println("SERVIDOR: Se empieza a enviar el ArrayList");

					//TODO METODO DE PRUEBA PARA ENVIAR UN ARRAYLIST<ARRAYLIST<FILA>>
					/*ArrayList<ArrayList<Fila>> todasLasFilas = new ArrayList<>();
					ArrayList<Fila> fila = new ArrayList<>();
					Fila f = new Fila(1, 1, 8, 15, "Enero");
					fila.add(f);
					f = new Fila(2, 2, 8, 15, "Marzo");
					fila.add(f);
					f = new Fila(3, 6, 8, 12, "Abril");
					fila.add(f);
					f = new Fila(4, 8, 8, 12, "Mayo");
					fila.add(f);
					todasLasFilas.add(fila);
					fila = new ArrayList<>();
					f = new Fila(1, 3, 8, 12, "Mayo");
					fila.add(f);
					f = new Fila(2, 2, 8, 10, "Julio");
					fila.add(f);
					f = new Fila(3, 9, 8, 10, "Agosto");
					fila.add(f);
					todasLasFilas.add(fila);
					fila = new ArrayList<>();
					f = new Fila(1, 6, 8, 12, "Junio");
					fila.add(f);
					f = new Fila(2, 10, 8, 12, "Septiembre");
					fila.add(f);
					f = new Fila(3, 13, 8, 10, "Enero");
					fila.add(f);
					f = new Fila(4, 3, 8, 12, "Noviembre");
					fila.add(f);
					f = new Fila(5, 1, 8, 10, "Marzo");
					fila.add(f);
					todasLasFilas.add(fila);*/
					//TODO FIN DEL METODO
					
					bd.init();
					arrayFilas = bd.obtenerFilasMaquina(1);
					arrayDeArrays.add(arrayFilas);
					arrayFilas = bd.obtenerFilasMaquina(2);
					arrayDeArrays.add(arrayFilas);
					arrayFilas = bd.obtenerFilasMaquina(3);
					arrayDeArrays.add(arrayFilas);
					arrayFilas = bd.obtenerFilasMaquina(4);
					arrayDeArrays.add(arrayFilas);
					arrayFilas = bd.obtenerFilasMaquina(5);
					arrayDeArrays.add(arrayFilas);
					bd.end();

					sm.Escribir("INI122\r\n");
					for (int i=0; i<arrayDeArrays.size(); i++) {
						arrayFilas = arrayDeArrays.get(i);
						for (int x=0; x<arrayFilas.size(); x++) {
							Fila f1 = arrayFilas.get(x);
							String sentencia = f1.getPos() + ":" + f1.getId_producto() + ":" + f1.getCantidad() + ":" + f1.getCantidadMaxima() + ":" + f1.getFechaUltimaRecarga();
							System.out.println(sentencia);
							sm.Escribir(sentencia + "\r\n");
						}
						sm.Escribir("SIGMAQ\r\n");
					}
					System.out.println("SERVIDOR: Se ha enviado el ArrayList");
					sm.Escribir("FIN222\r\n");
				}

				else if (comando.equals("GUARDARFILAS")) {
					
					int maquina = Integer.parseInt(clave);
					ArrayList<Fila> array = new ArrayList();
					boolean finalizado = false;
					System.out.println("--------------------------------------------------");
					System.out.println("--------------------------------------------------");
					System.out.println("--------------------------------------------------");
					String s = "ARRAYM" + clave;
					sm.Escribir(s + "\r\n");
					while (!finalizado) {
						clientSentence = sm.Leer();
						if (clientSentence.equals("FIN")) {
							finalizado = true;
						}
						else {
							StringTokenizer tok = new StringTokenizer(clientSentence, ":");
							String posicion = tok.nextToken();
							String producto = tok.nextToken();
							String cantidad = tok.nextToken();
							String cantidadMax = tok.nextToken();
							String fechaUltimaRecarga = tok.nextToken();
							Fila f = new Fila(posicion, producto, cantidad, cantidadMax, fechaUltimaRecarga);
							System.out.println("Se ha recibido esta fila: " + f.getPos() + "-" + f.getId_producto() + 
									"-" + f.getCantidad() + "-" + f.getCantidadMaxima() + "-" + f.getFechaUltimaRecarga());
							array.add(f);
						}
					}
					bd.init();
					bd.actualizarFilasMaquina(array, maquina + 1);
					bd.end();
				}

				else if (clientSentence.equals("SALIR")) {
					sm.Escribir("FUERA");
					parar = true;
					sm.CerrarSocket();
					sm.CerrarStreams();
				}
			} catch (Exception e) {
				parar = true;
			}
		}
	}
}
